//最佳调度问题
#include <iostream>
#include <climits>

using namespace std;
const int MAXN = 20;
const int MAXK = 10;

int n, k;
int t[MAXN + 1];
int complete_time[MAXK + 1];

int mintime = 0;
void search(int x, int endtime,int has_machine) {//has_machine为已经安排的机器数
    if (x > n)
        return;
    int last=has_machine+1>k?k:has_machine+1;
    for (int i = 1; i <= last; i++) {
        complete_time[i] += t[x];
        int new_endtime = complete_time[i] > endtime ? complete_time[i] : endtime;

        if (x == n) {
            if (new_endtime < mintime)
                mintime = new_endtime;
        } else if (new_endtime < mintime) {
            if (i>has_machine) search(x + 1, new_endtime,has_machine+1);
            else search(x+1,new_endtime,has_machine);
        }

        complete_time[i] -= t[x];
    }
}
int main() {
    cin >> n >> k;

    for (int i = 1; i <= n; i++) {
        cin >> t[i];
    }

    mintime = INT_MAX;
    complete_time[1] += t[1]; //把第一个任务固定在机器1上，这样稍微快点。
    search(2, t[1],1); //如果不固定第一个任务在机器1上，则直接search(1,0);
    cout << mintime;
}